home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
AdobeExamples
/
NX_StrAdj
/
StrokeView.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
7KB
|
223 lines
/*
* (a) (C) 1990 by Adobe Systems Incorporated. All rights reserved.
*
* (b) If this Sample Code is distributed as part of the Display PostScript
* System Software Development Kit from Adobe Systems Incorporated,
* then this copy is designated as Development Software and its use is
* subject to the terms of the License Agreement attached to such Kit.
*
* (c) If this Sample Code is distributed independently, then the following
* terms apply:
*
* (d) This file may be freely copied and redistributed as long as:
* 1) Parts (a), (d), (e) and (f) continue to be included in the file,
* 2) If the file has been modified in any way, a notice of such
* modification is conspicuously indicated.
*
* (e) PostScript, Display PostScript, and Adobe are registered trademarks of
* Adobe Systems Incorporated.
*
* (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
* CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
* AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
* ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
* OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
* WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
* WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
* DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
* OF THIRD PARTY RIGHTS.
*/
/*
* StrokeView.m
*
* The purpose of the application is to show the difference when stroke adjustment is
* turned on and turned off. The default state on the NeXT computer is ON. Horizontal,
* verticle, diagonal lines and arcs are drawn at a set linespacing. The linewidth can be
* varied from the interface.
*
* This file contains the methods for the StrokeView class, a subclass of view.
* The important item to note is simply the effect that stroke adjustment has. Refer
* to the documentation for specifics on how stroke adjustment works.
*
* Version: 2.0
* Author: John-Henry Gross, Ken Fromm
* History:
* 03-07-91 Added this comment.
*/
#import "StrokeView.h"
#import "StrokeViewWraps.h"
#import <appkit/Button.h>
#import <appkit/Control.h>
#import <appkit/Matrix.h>
#import <appkit/TextField.h>
#import <dpsclient/wraps.h>
#include <math.h>
@implementation StrokeView
/* Allocate a gstate and set clipping to NO. The gstate is allocated because we do not
* want to reset the individual drawing variables when the context is switched back to this
* view. Place the line [self setClipping:NO]; after allocating the gstate to see the effect
* clipping has.
*
* The PSWDefs() call sends some definitions used in the wraps to the interpreter. They
* will be available in the interpreter when the wraps call them.
*/
+ newFrame:(NXRect *) frm
{
self = [super newFrame:frm];
[self allocateGState];
PSWDefs ();
return self;
}
/* Free the gstate upon quitting. */
- free
{
[self freeGState];
return [super free];
}
- setTimeDisplay:anObject
{
timeDisplay = anObject;
return self;
}
- setFieldWidth:anObject
{
fieldWidth = anObject;
return self;
}
- setMatrixLineTypes:anObject
{
matrixLineTypes = anObject;
return self;
}
- setStrokeAdjustment:(BOOL)strokeAdjValue
{
strokeAdjustment = strokeAdjValue;
return self;
}
/********************************************************************************************
* These static procedures are called within drawSelf: They simply draw lines in
* the rectangle passed in. They have been separated out of drawSelf:: mainly
* for cosmetic reasons.
********************************************************************************************/
/* Adds horizontal lines to the path within rect. */
static void makeHorizLines(NXRect *rect)
{
float ypos, linespacing;
linespacing = rect->size.height/NUMLINESHORIZ;
for (ypos = rect->origin.y; ypos <= rect->origin.y + rect->size.height; ypos += linespacing)
PSWMakeLine(rect->origin.x, ypos, rect->origin.x + rect->size.width, ypos);
PSstroke();
}
/* Adds verticle lines to the path within rect. */
static void makeVertLines(NXRect *rect)
{
float xpos, linespacing;
linespacing = rect->size.width/NUMLINESVERT;
for (xpos = rect->origin.x; xpos <= rect->origin .x + rect->size.width; xpos += linespacing)
PSWMakeLine(xpos, rect->origin.y, xpos, rect->origin.y + rect->size.height);
PSstroke();
}
/* Adds diagonal lines to the path within rect. The rectangle has to be clipped because
* the length of the line exceeds the height and the width. Clipping will show only the
* portion of the lines that fall within the rectangle.
*/
static void makeDiagLines(NXRect *rect)
{
float angle, length;
length = (float) sqrt(rect->size.width * rect->size.width + rect->size.height * rect->size.height);
PSgsave();
PStranslate(rect->origin.x, rect->origin.y);
for (angle = 0; angle <= 90; angle += DIAGDEGS)
{
PSWMakeLine(0, 0, length, 0);
PSrotate(DIAGDEGS);
}
PSstroke();
PSgrestore();
}
/* Adds arcs within rect. Clipping is necessary because height is greater than the width
* and so some arcs will travel outside the rectangle
*/
static void makeArcs(NXRect *rect)
{
float radius, maxradius, spacing;
maxradius = (float) sqrt(rect->size.width * rect->size.width +
rect->size.height * rect->size.height);
spacing = maxradius/NUMARCS;
for (radius = spacing; radius <= maxradius; radius += spacing)
PSWMakeArc(rect->origin.x, rect->origin.y, radius, 0, 90);
PSstroke();
}
/* Actions performed: erase the display times in the interface, obtain the state of each
* line type button, clear the view by drawing a new background, set the values of the drawing
* variables, draw stroke adjusted lines and then non-stroke adjusted lines (displaying the
* times as well), reset the stroke adjustment and then draw the borders around the view.
*/
- drawSelf:(NXRect *)r :(int) count
{
int ElapsedTime;
[timeDisplay setStringValue:""];
PSsetgray(BACKGROUND);
PSrectfill(bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);
PSsetstrokeadjust(YES);
PSsetlinewidth(BORDERWIDTH);
PSsetgray(BORDERCOLOR);
PSrectstroke(bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);
PSsetgray(LINECOLOR);
PSsetlinewidth([fieldWidth floatValue]);
PSsetstrokeadjust(strokeAdjustment);
PSWMarkTime(); NXPing ();
if ([[matrixLineTypes cellAt:0 :0] state])
makeHorizLines(&bounds);
if ([[matrixLineTypes cellAt:0 :1] state])
makeVertLines(&bounds);
if ([[matrixLineTypes cellAt:1 :0] state])
makeDiagLines(&bounds);
if ([[matrixLineTypes cellAt:1 :1] state])
makeArcs(&bounds);
PSWReturnTime (&ElapsedTime);
[timeDisplay setIntValue:ElapsedTime];
return self;
}
@end